﻿using System;
using System.Xml;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Collections.Generic;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.UI.Bovespa.Ordens.Model;
using Sinacor.UI.Bovespa.Ordens.Communication;
using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Operador.Operador;
using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Calendario.Calendario;
using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa;
using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.PreBoleto;
using Sinacor.UI.Bovespa.Clientes.Communication;
using Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente;
using System.Globalization;
using System.Collections.ObjectModel;

namespace Sinacor.UI.Bovespa.Ordens.Presenter 
{

    public class OrdensMegaBolsaPresenter: BasePresenter<IOrdensMegaBolsa>
    {
        private IOrdensMegaBolsa _view;
        private Sinacor.UI.Bovespa.Ordens.Communication.Ordem _comunicacaoOrdem;
        private Sinacor.UI.Bovespa.Ordens.Communication.Calendario _comunicacaoCalendario;
        private Sinacor.UI.Bovespa.Ordens.Communication.Operador _comunicacaoOperador;
        private Sinacor.UI.Bovespa.Clientes.Communication.Cliente _comunicacaoCliente;
        private ModelCollection<ModelItemOrdensMegaBolsa> _itensMegabolsa;

        #region Models
        public ModelCollection<ModelItemOrdensMegaBolsa> itensMegabolsa 
        {
            get { return _itensMegabolsa; }
            set { _itensMegabolsa = value;
            if (value != null)
                itensMegabolsa.EnableStateControl = true;
            }
            
        }

       
        private ModelCollection<Model.CasamentoPreBoleto> _ModelPreBoletoAnalitico;
        /// <summary>
        /// Contém as models que serão exibidas no grid, repare que somente a própria presenter
        /// pode inicializar e preencher esta property
        /// </summary>
        public ModelCollection<Model.CasamentoPreBoleto> ModelPreBoletoAnalitico
        {
            get { return _ModelPreBoletoAnalitico; }
            private set
            {
                _ModelPreBoletoAnalitico = value;
                if (_ModelPreBoletoAnalitico != null)
                {
                    // Habilitando controle de estado, procure habilitar o 
                    // controle de estado no set da property
                    this.ModelPreBoletoAnalitico.EnableStateControl = true;
                }
            }
        }
        #endregion

        public OrdensMegaBolsaPresenter(IOrdensMegaBolsa view) : base(view)
        {
            this._view = view;
            this.itensMegabolsa = new ModelCollection<ModelItemOrdensMegaBolsa>();
            this.ModelPreBoletoAnalitico = new ModelCollection<Model.CasamentoPreBoleto>();
		}

		#region PrepararChamadaPreBoleto
		public void PrepararChamadaPreBoleto(object linhaSelecionado, ref Model.CasamentoPreBoleto model)
        {
			ModelItemOrdensMegaBolsa ordem = null;
            try
            {
                View.IniciarProcesso();
                ordem = (ModelItemOrdensMegaBolsa)linhaSelecionado;

                if (ordem != null)
                {
                    model.DataOrdem = ordem.DataOrdem.Value;
                    model.NumeroOrdem = ordem.Numero.Value;
                    model.NumeroOrdemSequencia = ordem.NumeroOrdemSubSequencia.Value;
                    model.QtdeOrdem = ordem.Quantidade;
                    model.QtdeADRAnexoIV = ordem.AnexoIV; //incluido - esertorio - 200804172245 - ref issue ID0000088
                    model.QtdeADRAnexoV = ordem.AnexoV;
                    model.Papel = ordem.Titulo;
                    model.Apelido = ordem.ApelidoCliente;
                    //if (ordem.NaturezaOperacao.HasValue)
                    model.TipoNaturezaOperacao = (Model.Enum.TipoNaturezaOperacao)ordem.NaturezaOperacao.Value;
                    //if (ordem.Mercado.HasValue)
                    model.TipoMercado = (Model.Enum.TipoMercado)ordem.Mercado.Value;

                }
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }
        #endregion             
   
		#region CarregarOperadores
		public void CarregarOperadores()
        {
            ModelCollection<Model.Operador> retorno = null;
            try
            {
                View.IniciarProcesso();
                this._comunicacaoOperador = new Sinacor.UI.Bovespa.Ordens.Communication.Operador(this.Session);
                retorno = this._comunicacaoOperador.ConsultarOperador();
                if (retorno != null)
                    this._view.ExibirOperadores(retorno);
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }
        #endregion

		#region CarregarCalendario
		public void CarregarCalendario()
        {
            ModelCollection<Model.Calendario> retorno = null;
            try
            {
                View.IniciarProcesso();
                _comunicacaoCalendario = new Sinacor.UI.Bovespa.Ordens.Communication.Calendario(this.Session);
                retorno = _comunicacaoCalendario.ConsultarCalendario();

                List<String> datas = new List<String>();
                for (int x = retorno.Count - 1; x >= 0; x--)
                    datas.Add(retorno[x].DataPregao.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern));

                if (retorno != null)
                    this._view.ExibirCalendario(datas);
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }
        #endregion

		#region CarregarDataMovimento
        public void CarregarDataMovimento()
        {
            CalendarioResponse retorno = null;
            try
            {
                View.IniciarProcesso();
                this._comunicacaoCalendario = new Sinacor.UI.Bovespa.Ordens.Communication.Calendario(this.Session);
                retorno = this._comunicacaoCalendario.ConsultarDataMovimento();
                if (retorno != null)
                    this._view.ExibirDataMovimento(retorno.DataPregao);
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }
        #endregion

		#region AlterarOrdemMegaBolsa
        public void AlterarOrdemMegaBolsa(List<Model.ModelItemOrdensMegaBolsa> updatedLine)
        {
            AlterarOrdemMegaBolsaRequest request = null;
            AlterarOrdemMegaBolsaResponse retorno = null;
            ModelOrdensMegaBolsa modelMegaBolsa = null;

            try
            {
                View.IniciarProcesso();
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);

                foreach (ModelItemOrdensMegaBolsa response in updatedLine)
                {
                    request = new AlterarOrdemMegaBolsaRequest();
                    request.DataOrdem = response.DataOrdem;
                    request.NumeroOrdem = response.Numero;
                    request.NumeroOrdemSubSequencia = response.NumeroOrdemSubSequencia;
                    request.ApelidoCliente = response.ApelidoCliente;
                    request.TipoLiquidacao = (Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao)response.TipoLiquidacaoOrdem.Value;
                    request.Carteira = response.Carteira;
                    request.PercentualReducaoAcrescimo = response.PercentualReducaoAcrescimo;

                    retorno = this._comunicacaoOrdem.AlterarOrdemMegaBolsa(request);

                    if (retorno != null)
                    {
                        modelMegaBolsa = new ModelOrdensMegaBolsa();

                        if (retorno.MensagemValidacaoSaldo != null && retorno.MensagemValidacaoSaldo.Descricao != "")
                            modelMegaBolsa.MensagemValidacaoSaldo = retorno.MensagemValidacaoSaldo.Descricao;

                        if (retorno.BloqueioCliente != null && retorno.BloqueioCliente._descricaoBloqueio != "")
                        {
                            modelMegaBolsa.DescricaoBloqueio = retorno.BloqueioCliente._descricaoBloqueio;
                            //20080425 14:18 - RValadao
                            //Se o cliente estiver bloqueado então passa o apelido do cliente origem para a model
                            //para ser recuperado na view
                            modelMegaBolsa.ApelidoCliente = response.ApelidoCliente;
                        }
                        else
                            modelMegaBolsa.ApelidoCliente = retorno.ApelidoCliente;

                        modelMegaBolsa.Carteira = retorno.Carteira;
                        modelMegaBolsa.DataMovimento = retorno.DataOrdem.Value;
                        modelMegaBolsa.DataPregao = retorno.DataPregao;
                        modelMegaBolsa.Numero = retorno.NumeroOrdem;
                        modelMegaBolsa.NumeroSubSequencia = retorno.NumeroOrdemSubSequencia.Value;
                        modelMegaBolsa.PercentualReducaoAcrecismo = retorno.PercentualCorretagem;

                        if (retorno.TipoLiquidacao != null)
                        {
                            switch (retorno.TipoLiquidacao)
                            {
                                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Custodiante:
                                    modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Custodiante;
                                    break;
                                //20080422 10:48 - RValadao
                                //Este tipo de liquidação não existe mais, conforme bug 3488
                                //case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Arbitragem:
                                //    modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.TipoLiquidacao.Arbitragem;
                                //    break;
                                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Normal:
                                    modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal;
                                    break;
                                default:
                                    modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal;
                                    break;
                            }
                        }
                        else
                        {
                            modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal;
                        }
                        //20080425 15:03 - RValadao
                        //Passando nova instancia pois ainda não será utilizado.
                        this._view.AlterarOrdemMegaBolsa(modelMegaBolsa, new ModelItemOrdensMegaBolsa());
                    }
                }
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }

        public void AlterarItemOrdemMegaBolsa(object updatedLine, ModelItemOrdensMegaBolsa modelItemAnterior)
        {
            AlterarOrdemMegaBolsaRequest request = null;
            AlterarOrdemMegaBolsaResponse retorno = null;
            ModelOrdensMegaBolsa modelMegaBolsa = null;

            try
            {
                View.IniciarProcesso();
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);
                ModelItemOrdensMegaBolsa model = (ModelItemOrdensMegaBolsa)updatedLine;
                request = new AlterarOrdemMegaBolsaRequest();
                request.DataOrdem = model.DataOrdem;
                request.NumeroOrdem = model.Numero;
                request.NumeroOrdemSubSequencia = model.NumeroOrdemSubSequencia;
                request.ApelidoCliente = model.ApelidoCliente;

                if (model.TipoLiquidacaoOrdem != null)
                {
                    switch (model.TipoLiquidacaoOrdem.Value)
                    {
                        case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Custodiante:
                            request.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Custodiante;
                            break;
                        case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal:
                            request.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Normal;
                            break;
                        default:
                            request.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Normal;
                            break;
                    }
                }
                else
                {
                    request.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Normal;
                }
                request.Carteira = model.Carteira;
                request.PercentualReducaoAcrescimo = model.PercentualReducaoAcrescimo;
                retorno = this._comunicacaoOrdem.AlterarOrdemMegaBolsa(request);

                if (retorno != null)
                {
                    modelMegaBolsa = new ModelOrdensMegaBolsa();

                    if (retorno.MensagemValidacaoSaldo != null && retorno.MensagemValidacaoSaldo.Descricao != "")
                        modelMegaBolsa.MensagemValidacaoSaldo = retorno.MensagemValidacaoSaldo.Descricao;
                    if (retorno.BloqueioCliente != null && retorno.BloqueioCliente._descricaoBloqueio != "")
                        modelMegaBolsa.DescricaoBloqueio = retorno.BloqueioCliente._descricaoBloqueio;

                    modelMegaBolsa.ApelidoCliente = retorno.ApelidoCliente;
                    modelMegaBolsa.Carteira = retorno.Carteira;
                    modelMegaBolsa.DataMovimento = retorno.DataOrdem.Value;
                    modelMegaBolsa.DataPregao = retorno.DataPregao;
                    modelMegaBolsa.Numero = retorno.NumeroOrdem;
                    modelMegaBolsa.NumeroSubSequencia = retorno.NumeroOrdemSubSequencia.Value;
                    modelMegaBolsa.PercentualReducaoAcrecismo = retorno.PercentualCorretagem;

                    if (retorno.TipoLiquidacao != null)
                    {
                        switch (retorno.TipoLiquidacao)
                        {
                            case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Custodiante:
                                modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Custodiante;
                                break;
                            //20080422 10:48 - RValadao
                            //Este tipo de liquidação não existe mais, conforme bug 3488
                            //case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Arbitragem:
                            //    modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.TipoLiquidacao.Arbitragem;
                            //    break;
                            case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Normal:
                                modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal;
                                break;
                            default:
                                modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal;
                                break;
                        }
                    }
                    else
                    {
                        modelMegaBolsa.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal;
                    }

                    this._view.AlterarOrdemMegaBolsa(modelMegaBolsa, modelItemAnterior);
                }
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }
        #endregion

		#region CarregarOrdemMegaBolsa
		public void CarregarOrdemMegaBolsa(ModelOrdensMegaBolsa model)
        {
            List<ConsultarOrdemMegaBolsaResponse> retorno = null;
            ConsultarOrdemMegaBolsaRequest request;
            try
            {
                View.IniciarProcesso();
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);
                request = new ConsultarOrdemMegaBolsaRequest();
                Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento tipoOrdem;
                switch (model.SituacaoOrdem.Value)
                {
                    case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.Casadas:
                        tipoOrdem = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.Casadas;
                        break;
                    case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.CasadasParte:
                        tipoOrdem = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.CasadasParte;
                        break;
                    case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.ExecutadasSemClientes:
                        tipoOrdem = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.ExecutadasSemClientes;
                        break;
                    case Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.NaoCasadas:
                        tipoOrdem = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.NaoCasadas;
                        break;
                    default:
                        tipoOrdem = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.Todas;
                        break;
                }
                request.ApelidoCliente = model.ApelidoCliente;
                request.DataPregao = Convert.ToDateTime(model.DataPregao);
                request.IsCanceladas = model.Canceladas;
                request.NumeroOrdem = model.Numero;
                request.Operador = model.Operador;
                request.Titulo = model.Titulo;
                request.TipoSituacaoCasamentoOrdem = tipoOrdem;
                retorno = _comunicacaoOrdem.ConsultarOrdensMegaBolsa(request);
                if (retorno != null)
                {
                    ModelCollection<ModelItemOrdensMegaBolsa> listModel = new ModelCollection<ModelItemOrdensMegaBolsa>();
                    foreach (ConsultarOrdemMegaBolsaResponse item in retorno)
                    {
                        ModelItemOrdensMegaBolsa modelItem = new ModelItemOrdensMegaBolsa();
                        modelItem.ApelidoCliente = item.ApelidoCliente;
                        modelItem.Bolsa = item.Bolsa;
                        modelItem.Carteira = item.Carteira;
                        modelItem.CodigoCliente = item.CodigoCliente;//20080512 14:18 - RValadao - Ref Issue 0004725 
                        modelItem.ContaMae = item.ContaMae;
                        modelItem.DataOrdem = item.DataOrdem;
                        modelItem.DataValidade = item.DataValidade;

                        //20080425 10:31 - RValadao
                        //Alterações na carga dos enums
                        if (item.Mercado.HasValue)
                            modelItem.Mercado = (Model.Enum.TipoMercado)item.Mercado.Value;

                        if (item.NaturezaOperacao.HasValue)
                            modelItem.NaturezaOperacao = (Model.Enum.TipoNaturezaOperacao)item.NaturezaOperacao.Value;

                            modelItem.TipoLiquidacaoOrdem = (Model.Enum.TipoLiquidacao)item.TipoLiquidacaoOrdem;

                        modelItem.TipoSituacaoCasamentoOrdem = (Model.Enum.TipoSituacaoOrdem)item.TipoSituacaoCasamentoOrdem;

                        modelItem.NomeCliente = item.NomeCliente;
                        modelItem.Numero = item.Numero;
                        modelItem.NumeroOrdemSubSequencia = item.NumeroOrdemSubSequencia;
                        modelItem.Operador = item.Operador;
                        modelItem.NomeOperador = item.NomeOperador;
                        modelItem.PercentualReducaoAcrescimo = item.PercentualReducaoAcrescimo;
                        modelItem.PessoaVinculada = item.PessoaVinculada;
                        modelItem.Quantidade = item.Quantidade;

                        modelItem.Titulo = item.Titulo;
                        modelItem.Situacao = item.Situacao;
                        modelItem.AnexoIV = item.AnexoIV; //incluido - esertorio - 200804172245 - ref issue ID0000088
                        modelItem.AnexoV = item.AnexoV;

                        listModel.Add(modelItem);
                    }
                    this.itensMegabolsa = listModel;
                    this.ModelPreBoletoAnalitico = null;
                    View.ExibirOrdemMegaBolsa();
                }
                else
                {
                    this.itensMegabolsa = null;
                    this.ModelPreBoletoAnalitico = null;
                    View.ExibirOrdemMegaBolsa();
                    this._view.ExibirMensagem(Model.Enum.Mensagem.RegistroNaoEncontrado);
                }
            }

            catch (Exception ex)
            {
                this.itensMegabolsa = null;
                this.ModelPreBoletoAnalitico = null;
                View.ExibirOrdemMegaBolsa();
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }
        #endregion

		#region CarregarPreBoletosAnalitico
		public void CarregarPreBoletosAnalitico(ModelOrdensMegaBolsa model)
        {
            List<ConsultarPreBoletoAnaliticoResponse> preBoletos = null;
            ConsultarPreBoletoAnaliticoRequest filtro;
            ModelCollection<CasamentoPreBoleto> listModel = null;
            Model.CasamentoPreBoleto ModelPreBoleto = null;
            this.ModelPreBoletoAnalitico = new ModelCollection<CasamentoPreBoleto>();

            try
            {
                View.IniciarProcesso();
                
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);
                filtro = new ConsultarPreBoletoAnaliticoRequest();
                ModelItemOrdensMegaBolsa ordem = (ModelItemOrdensMegaBolsa)model.LinhaSelecionada;

                if (ordem != null)
                {
                    filtro.DataOrdem = Convert.ToDateTime(ordem.DataOrdem);
                    filtro.DataPregao = Convert.ToDateTime(model.DataPregao);
                    filtro.NumeroOrdem = (int)ordem.Numero;
                    filtro.NumeroOrdemSequencia = (int)ordem.NumeroOrdemSubSequencia;
                    preBoletos = this._comunicacaoOrdem.ConsultarPreBoletoAnalitico(filtro);
                }

                if (preBoletos == null)
                    this._view.ExibirMensagem(Model.Enum.Mensagem.RegistroNaoEncontrado);
                else
                {
                    listModel = new ModelCollection<CasamentoPreBoleto>();
                    foreach (ConsultarPreBoletoAnaliticoResponse item in preBoletos)
                    {
                        ModelPreBoleto = new CasamentoPreBoleto();
                        ModelPreBoleto.Cambio = item.Cambio;
                        ModelPreBoleto.NumeroOrdem = item.NumeroOrdem;
                        ModelPreBoleto.NumeroOrdemSequencia = item.NumeroOrdemSequencia;
                        ModelPreBoleto.Preco = item.Preco;
                        ModelPreBoleto.QuantidadeCasada = item.QuantidadeCasada;
                        ModelPreBoleto.QuantidadeNegocio = item.QuantidadeNegocio;

                        if (item.TipoCasamento != null)
                        {
                            switch (item.TipoCasamento)
                            {
                                case Communication.Bovespa.Ordens.PreBoleto.TipoCasamento.Nada:
                                    ModelPreBoleto.TipoCasamento = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoCasamento.Nada;
                                    break;
                                case Communication.Bovespa.Ordens.PreBoleto.TipoCasamento.Parcial:
                                    ModelPreBoleto.TipoCasamento = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoCasamento.Parcial;
                                    break;
                                case Communication.Bovespa.Ordens.PreBoleto.TipoCasamento.Total:
                                    ModelPreBoleto.TipoCasamento = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoCasamento.Total;
                                    break;

                            }
                        }
                        else
                        {
                            ModelPreBoleto.TipoCasamento = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoCasamento.Nada;
                        }
                        if (item.TipoEstrategia.HasValue)
                        {
                            switch (item.TipoEstrategia)
                            {
                                case Communication.Bovespa.Ordens.PreBoleto.TipoEstrategia.BOX:
                                    ModelPreBoleto.TipoEstrategia = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoEstrategia.BOX;
                                    break;
                                case Communication.Bovespa.Ordens.PreBoleto.TipoEstrategia.DBX:
                                    ModelPreBoleto.TipoEstrategia = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoEstrategia.DBX;
                                    break;
                                case Communication.Bovespa.Ordens.PreBoleto.TipoEstrategia.Nenhuma:
                                    ModelPreBoleto.TipoEstrategia = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoEstrategia.Nenhuma;
                                    break;
                                case Communication.Bovespa.Ordens.PreBoleto.TipoEstrategia.POP:
                                    ModelPreBoleto.TipoEstrategia = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoEstrategia.POP;
                                    break;
                            }
                        }

                        if (item.TipoSituacaoCasamento.HasValue)
                        {
                            switch (item.TipoSituacaoCasamento)
                            {
                                case Communication.Bovespa.Ordens.PreBoleto.TipoSituacaoCasamento.NaoCasadas:
                                    ModelPreBoleto.TipoSituacaoCasamento = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoCasamento.NaoCasadas;
                                    break;
                                case Communication.Bovespa.Ordens.PreBoleto.TipoSituacaoCasamento.CasadasParte:
                                    ModelPreBoleto.TipoSituacaoCasamento = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoCasamento.CasadasParte;
                                    break;
                                case Communication.Bovespa.Ordens.PreBoleto.TipoSituacaoCasamento.Casadas:
                                    ModelPreBoleto.TipoSituacaoCasamento = Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoCasamento.Casadas;
                                    break;

                            }
                        }

                        ModelPreBoleto.DataOrdem = item.DataOrdem;
                        ModelPreBoleto.DataPregao = item.DataPregao;
                        ModelPreBoleto.Volume = item.Volume;

                        listModel.Add(ModelPreBoleto);

                    }

                    this.ModelPreBoletoAnalitico = listModel;
                }
            }

            catch (Exception ex)
            {
                base.HandleException(ex);
            }
            finally
            {
                View.ExibirPreBoletosAnalitico();
                View.FinalizarProcesso();
            }
        }
        #endregion

        #region InformarStatusPreBoleto
        public void InformarStatusPreBoleto(Model.Enum.TipoSituacaoCasamento status)
        {
            switch (status)
            {
                case Model.Enum.TipoSituacaoCasamento.Casadas:
                    this.View.InformarCasadas();
                    break;

                case Model.Enum.TipoSituacaoCasamento.NaoCasadas:
                    this.View.InformarNaoCasadas();
                    break;

                case Model.Enum.TipoSituacaoCasamento.CasadasParte:
                    this.View.InformarCasadasParte();
                    break;

                default:
                    break;
            }
        }
        #endregion

		#region CarregarCliente
		public bool CarregarCliente(object content)
        {
            bool exibir = false;
            bool retornoErro = true;
            ClienteResponse retorno = null;
            ConsultarClienteApelidoRequest request;
            ModelOrdensMegaBolsa modelMegaBolsa = null;
            try
            {
                View.IniciarProcesso();
                this._comunicacaoCliente = new Sinacor.UI.Bovespa.Clientes.Communication.Cliente(this.Session);
                request = new ConsultarClienteApelidoRequest();

                if (content.GetType().Equals(typeof(string)))
                {
                    exibir = true;
                    request.Apelido = content.ToString();
                }
                else
                {
                    request.Apelido = ((ModelItemOrdensMegaBolsa)content).ApelidoCliente;
                }

                
                retorno = this._comunicacaoCliente.ConsultarClienteApelido(request);


                if (retorno != null)
                {
                    modelMegaBolsa = new ModelOrdensMegaBolsa();

                    if (retorno.TipoLiquidacao.HasValue)
                        modelMegaBolsa.TipoLiquidacao = (EnumWrapper<Model.Enum.TipoLiquidacao>)ConverterEnumCommunication<Model.Enum.TipoLiquidacao>(retorno.TipoLiquidacao);

                    modelMegaBolsa.PercentualReducaoAcrecismo = retorno.PercentualReducaoAcrescimo;
                    modelMegaBolsa.ContaMae = retorno.ClienteBroker;
                    modelMegaBolsa.IsPessoaVinculda = retorno.isPessoaVinculada;
                    modelMegaBolsa.NomeCliente = retorno.Nome;
                    modelMegaBolsa.IsBloqueado = retorno.isBloqueado;

                    if (exibir)
                    {
                        this._view.ExibirDadosCliente(modelMegaBolsa);
                    }

                    retornoErro = true;
                }
                else
                {
                    retornoErro = false;
                }
            }

            catch (Exception ex)
            {
                HandleException(ex);
                retornoErro = false;
            }
            finally
            {
                View.FinalizarProcesso();
            }
            return retornoErro;
        }
        #endregion

		#region ValidarDataPregaoPreBoletoOrdem
		public bool ValidarDataPregaoPreBoletoOrdem(ModelOrdensMegaBolsa model, object selectedItem)
        {
            ValidarDataPregaoPreBoletoOrdemRequest request = null;
            ModelItemOrdensMegaBolsa response = null;
            try
            {
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);
                request = new ValidarDataPregaoPreBoletoOrdemRequest();
                request.DataPregaoPreBoleto = model.DataMovimento;

                response = (ModelItemOrdensMegaBolsa)selectedItem;
                if (response != null)
                {
                    request.DataOrdem = response.DataOrdem.Value;
                    request.NumeroOrdem = response.Numero.Value;
                    request.NumeroOrdemSubSequencia = response.NumeroOrdemSubSequencia;
                    //20080504 18:03 - RValadao
                    //Parametro para verificar a permissão do usuário alterar pré boleto.
                    request.DataValidade = response.DataValidade;
                }

                this._comunicacaoOrdem.ValidarDataPregaoPreBoletoOrdem(request); //alterado - esertorio - 200804281517 - ref issue ID0003686
            }
            
            catch (Exception ex)
            {
                HandleException(ex);
                return false;
            }
            return true;
        }
        #endregion

		#region ValidarTipoLiquidacaoOrdensMegaBolsa
        public bool ValidarTipoLiquidacaoOrdensMegaBolsa(object content, object selectedItem)
        {
            AlterarOrdemMegaBolsaRequest request = null;
            ConsultarOrdemMegaBolsaResponse modelMegaBolsa = null;

            try
            {
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);
                request = new AlterarOrdemMegaBolsaRequest();

                modelMegaBolsa = (ConsultarOrdemMegaBolsaResponse)selectedItem;
                if (modelMegaBolsa != null)
                {
                    request.ApelidoCliente = modelMegaBolsa.ApelidoCliente;
                    request.Carteira = modelMegaBolsa.Carteira;
                    request.DataOrdem = modelMegaBolsa.DataOrdem;
                    request.NumeroOrdem = modelMegaBolsa.Numero;
                    request.NumeroOrdemSubSequencia = modelMegaBolsa.NumeroOrdemSubSequencia;
                }

                if (content != null)
                {
                    if (Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Custodiante.ToString().Equals(content.ToString()))
                        request.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Custodiante;
                    else if (Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Normal.ToString().Equals(content.ToString()))
                        request.TipoLiquidacao = Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Normal;
                    else
                        return false;
                }

                this._comunicacaoOrdem.ValidarTipoLiquidacaoOrdensMegaBolsa(request);
            }
            
            catch (Exception ex)
            {
                HandleException(ex);
                return false;
            }

            return true;
        }
        #endregion

		#region ValidarPercentualReducaoAcrescimoOrdemMegaBolsa
        public bool ValidarPercentualReducaoAcrescimoOrdemMegaBolsa(object content, object selectedItem)
        {
            AlterarOrdemMegaBolsaRequest request;
            ModelItemOrdensMegaBolsa modelMegaBolsa = null;            

            try
            {
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);
                request = new AlterarOrdemMegaBolsaRequest();

                modelMegaBolsa = (ModelItemOrdensMegaBolsa) selectedItem;
                if (modelMegaBolsa != null)
                {
                    request.DataOrdem = modelMegaBolsa.DataOrdem;
                    request.NumeroOrdem = modelMegaBolsa.Numero;
                    request.NumeroOrdemSubSequencia = modelMegaBolsa.NumeroOrdemSubSequencia;
                    request.ApelidoCliente = modelMegaBolsa.ApelidoCliente;
                }

                if (content != null)
                {
                    request.PercentualReducaoAcrescimo = Convert.ToDecimal(content);
                }
                
                this._comunicacaoOrdem.ValidarPercentualReducaoAcrescimoOrdemMegaBolsa(request);
            }
            
            catch (Exception ex)
            {
                HandleException(ex);
                return false;
            }

            return true;
        }
        #endregion

		#region ValidarCarteiraOrdensMegaBolsa
		public bool ValidarCarteiraOrdensMegaBolsa(object content, object selectedItem)
        {
            AlterarOrdemMegaBolsaRequest request;
            ModelItemOrdensMegaBolsa modelMegaBolsa = null;
            try
            {
                this._comunicacaoOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session);
                request = new AlterarOrdemMegaBolsaRequest();
                modelMegaBolsa = (ModelItemOrdensMegaBolsa)selectedItem;//20080513 00:11 - RValadao - Utilizado para passar valores como parametro

                if (content != null)
                {
                    request.Carteira = Convert.ToInt32(content);
                    request.ApelidoCliente = modelMegaBolsa.ApelidoCliente; //20080513 00:11 - RValadao - Adicionado parametro ApelidoCliente para não ser barrado na validação
                    request.PercentualReducaoAcrescimo = modelMegaBolsa.PercentualReducaoAcrescimo;//20080513 00:11 - RValadao - Adicionado parametro PercentualReducaoAcrescimo para não ser barrado na validação
                }

                if (modelMegaBolsa != null)
                {
                    request.DataOrdem = modelMegaBolsa.DataOrdem;
                    request.NumeroOrdem = modelMegaBolsa.Numero;
                    request.NumeroOrdemSubSequencia = modelMegaBolsa.NumeroOrdemSubSequencia;
                }

                this._comunicacaoOrdem.ValidarCarteiraOrdensMegaBolsa(request);
            }
            
            catch (Exception ex)
            {
                HandleException(ex);
                return false;
            }

            return true;
        }
        #endregion

        #region CarregarOrdemMegaBolsaPopup

        /// <summary>
        ///     Método para transportar a ordem para o popup
        /// </summary>
        /// <param name="objeto"></param>
        /// <user>rdorta</user>
        public void CarregarOrdemMegaBolsaPopup(object objeto)
        {
            try
            {
                View.IniciarProcesso();
                ModelItemOrdensMegaBolsa negocio = (ModelItemOrdensMegaBolsa)objeto;
                ModelOrdensMegaBolsa model = new ModelOrdensMegaBolsa();
                //excluido - ini - esertorio - 200805271705 - ref issue ID0004841
                //if (!negocio.CodigoCliente.Equals(0)) //20080512 14:20 - RValadao - Alterado para atender bug 0004725
                //excluido - fim - esertorio - 200805271705 - ref issue ID0004841
                if (!String.IsNullOrEmpty(negocio.NomeCliente)) //incluido - esertorio - 200805271705 - ref issue ID0004841
                {
                    model.ApelidoCliente = negocio.ApelidoCliente;
                    model.NomeCliente = negocio.NomeCliente;
                }
                model.Carteira = negocio.Carteira;
                model.PercentualReducaoAcrecismo = negocio.PercentualReducaoAcrescimo;
                //if (negocio.TipoLiquidacaoOrdem.HasValue)
                model.TipoLiquidacao = negocio.TipoLiquidacaoOrdem.Value;

                this._view.ExibirOrdemPopup(model);
            }

            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }

        #endregion

        #region Traduzir Enum 

        /// <summary>
        /// Traduzir Enum Tipo Mercado da Response para Enum da Comum
        /// Renomeado e Alterado de forma a receber um enum como parametro ao inves de um object
        /// </summary>
        /// <param name="item"></param>
        /// <user>Mazevedo</user>
        public T? ConverterEnumCommunication<T>(object item)
            where T : struct
        {
            if (item == null)
                return null;

            if (item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoMercado) ||
                item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoMercado))
            {
                return (T)ConverterTipoMercado((Communication.Bovespa.Ordens.MegaBolsa.TipoMercado)item);
            }
            if (item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoNaturezaOperacao) ||
                item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoNaturezaOperacao))
            {
                return (T)ConverterTipoNaturezaOperacao((Communication.Bovespa.Ordens.MegaBolsa.TipoNaturezaOperacao)item);
            }
            if (item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao) ||
                item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao))
            {
                return (T)ConverterTipoLiquidacaoOrdem((Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao)item);
            }
            if (item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento) ||
                item.GetType() == typeof(Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento))
            {
                return (T)ConverterTipoSituacaoCasamentoOrdem((Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento)item);
            }
            return null;
        }

        private object
            ConverterTipoMercado(Communication.Bovespa.Ordens.MegaBolsa.TipoMercado item)
        {
            switch (item)
            {
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.BOX:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.BOX;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.Vista:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.Vista;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.OpcaoCompra:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.OpcaoCompra;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.OpcaoVenda:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.OpcaoVenda;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.ExercicioOpcaoCompra:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.ExercicioOpcaoCompra;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.ExercicioOpcaoVenda:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.ExercicioOpcaoVenda;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.Fracionario:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.Fracionario;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.Estruturado:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.Estruturado;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.Leilao:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.Leilao;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.Termo:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.Termo;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.LeilaoNaoCotados:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.LeilaoNaoCotados;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.Futuro:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.Futuro;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.VencimentoFuturo:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.VencimentoFuturo;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.IntegralizacaoResgateCotas:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.IntegralizacaoResgateCotas;
                case Communication.Bovespa.Ordens.MegaBolsa.TipoMercado.CotasETF:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoMercado.CotasETF;
                default:
                    return null;
            }
        }

        private object
            ConverterTipoNaturezaOperacao(Communication.Bovespa.Ordens.MegaBolsa.TipoNaturezaOperacao item)
        {
            switch (item)
            {
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoNaturezaOperacao.Compra:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoNaturezaOperacao.Compra;
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoNaturezaOperacao.Venda:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoNaturezaOperacao.Venda;
                default:
                    return null;
            }
        }

        private object
            ConverterTipoLiquidacaoOrdem(Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao item)
        {
            switch (item)
            {
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoLiquidacao.Custodiante:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Custodiante;
                //20080422 10:48 - RValadao
                //Este tipo de liquidação não existe mais, conforme bug 3488
                //case Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.Cliente.TipoLiquidacao.Arbitragem:
                //    return Sinacor.UI.Bovespa.Ordens.Model.TipoLiquidacao.Arbitragem;
                default:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoLiquidacao.Normal;
            }
        }

        private object
            ConverterTipoSituacaoCasamentoOrdem(Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento item)
        {
            switch (item)
            {
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.Casadas:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.Casadas;
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.CasadasParte:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.CasadasParte;
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.ExecutadasSemClientes:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.ExecutadasSemClientes;
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.NaoCasadas:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.NaoCasadas;
                case Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.MegaBolsa.TipoSituacaoCasamento.Todas:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.Todas;
                default:
                    return Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoSituacaoOrdem.NaoCasadas;
            }
        }

        #endregion
    }
}
